package main

import "fmt"

/**
基本语法：
	func 函数名(形参列表) 返回值类型列表 {
		函数体
		return 返回值列表
	}

函数名：
	命名规范：
		1 首字母不能是数字
		2 首字母大写该函数可以被其他包调用（类似于public）
		3 首字母小写该函数只能在当前包内调用（类似于private）

type 关键词：取别名
*/

// 没有返回值
func echo(s string) {
	fmt.Println("echo:", s)

}

// 一个返回值
func add1(x int, y int) int {
	return x + y
}

// 多个返回值
func swap(x, y string) (string, string) {
	return y, x
}

// 函数的参数为：可变参数 ... 参数的数量可变
func test1(args ...int) {
	fmt.Println("可变参数函数")
	for _, v := range args {
		fmt.Println(v)
	}
}

// 参数的类型为指针
func test2(num *int) {
	// 对应址的值进行修改
	*num = 100
}

// 定义一个函数，把另一个函数作为形参
func test3(num1 int, num2 int, testFunc func(int, int)) {
	testFunc(num1, num2)
}

// 对函数的返回值命名 [具名返回值]，里面的顺序就无所谓了
func sumSub(x int, y int) (sum int, sub int) {
	sum = x + y
	sub = x - y
	return
}
func main() {

	fmt.Println(add1(1, 2))
	echo("hello world")
	a, b := swap("a", "b")
	fmt.Println(a, b)
	test1(1, 2, 3, 4, 5)

	// 指针传递 变量的值在函数中被修改
	var a1 int = 10
	test2(&a1)
	fmt.Println(a1)

	fmt.Printf("%T \n", add1)
	//
	test3(1, 2, func(num1, num2 int) {
		fmt.Println(num1 + num2)
	})

	ra, rb := sumSub(1, 2)
	fmt.Println(ra, rb)
}
